#include "Jeu.h"

#include <assert.h>
#include <stdlib.h>

void jeuInit(Jeu *pJ,const char * nom_fichier)
{
	     
	terInit(&pJ->ter,nom_fichier);
	sokInit(&pJ->sok, &pJ->ter);
	caiInit(&pJ->lcai, &pJ->ter);
	objInit(&pJ->lobj,&pJ->ter);	
}

void jeuLibere(Jeu *pJ)
{
	caiLibere(&pJ->lcai);
	terLibere(&pJ->ter);
	objLibere(&pJ->lobj);
}


Terrain *jeuGetTerrainPtr(Jeu *pJ)
{
	return (&(pJ->ter));
}

Sokoban *jeuGetSokobanPtr(Jeu *pJ)
{
	return (&(pJ->sok));
}

ListeCaisse *jeuGetListeCaissePtr(Jeu *pJ)
{
	return (&(pJ->lcai));
}

ListeObjectif *jeuGetObjectifPtr(Jeu *pJ)
{
	return (&(pJ->lobj));
}

const ListeObjectif *jeuGetConstObjectifPtr(const Jeu *pJ)
{
	return (&(pJ->lobj));
}

Caisse *jeuGetCaissePtr(Jeu *pJ,const int x, const int y)
{
	Caisse *pCai;
	pCai=caiRecherche(&pJ->lcai,x,y);
	return pCai;
  
}

const Terrain *jeuGetConstTerrainPtr(const Jeu *pJ)
{
	return (&(pJ->ter));
}

const Sokoban *jeuGetConstSokobanPtr(const Jeu *pJ)
{
	return (&(pJ->sok));
}

const ListeCaisse *jeuGetConstListeCaissePtr(const Jeu *pJ)
{
	return (&(pJ->lcai));
}

Caisse *jeuGetConstCaissePtr(Jeu *pJ,const int x, const int y)
{
	Caisse *pCai;
	
	pCai=caiRecherche(&pJ->lcai,x,y);
	return pCai;
  
}


void jeuActionClavier(Jeu *pJ, const char touche)
{
	switch(touche)
	{
		case 'g':
			sokGauche(&(pJ->sok), &(pJ->ter),&(pJ->lcai));
			break;
		case 'd':
			sokDroite(&(pJ->sok),&(pJ->ter),&(pJ->lcai));
			break;
		case 'h':
			sokHaut(&(pJ->sok),&(pJ->ter),&(pJ->lcai));
			break;
		case 'b':
			sokBas(&(pJ->sok),&(pJ->ter),&(pJ->lcai));
			break;
	}
	
  
}


void jeuTestRegression()
{
	Terrain *pTer;
	Sokoban *pSok;
	Caisse *pCai;
	ListeCaisse *pLCai;
	ListeObjectif *pLObj;
	
	Jeu J;
	
	char nom_fichier[]="data/niveau/niveau1.txt";
	
	/*on initialise le jeu qui a son tour initialise le terrain le sokoban les listes de caisse et d'objectif*/
	jeuInit(&J,nom_fichier);
	
	/*on verifie que le terrain a bien ete initialise*/
	pTer=jeuGetTerrainPtr(&J);
	assert(pTer!=NULL);
	
	/*on verifie que le sokoban a bien ete initialise*/
	pSok=jeuGetSokobanPtr(&J);
	assert(pSok!=NULL);
	
	/*on verifie  la presence ou non de la caisse a la position 5, 11*/
	pCai=jeuGetCaissePtr(&J,5,11);
	assert(pCai!=NULL);
	
	/*on verifie que la liste de caisse  a bien ete initialise*/
	pLCai=jeuGetListeCaissePtr(&J); 
	assert(pLCai!=NULL);
	
	/*on verifie que la liste d'objectif a bien ete initialise*/
	pLObj=jeuGetObjectifPtr(&J); 
	assert(pLObj!=NULL);
	
	/*On verifie les actions clavier effectues */
	jeuActionClavier(&J,'h');
	
	jeuLibere(&J);
	jeuActionClavier(&J,'h');
  }
